home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / SWAG9605.DDD / 0124_Re: String Queues.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-05-31  |  2.8 KB  |  161 lines

  1.  
  2. UNIT Queues;  { see test program at the end ! }
  3.  
  4. INTERFACE
  5.  
  6. TYPE
  7.   PStrRec = ^TStrQueue;
  8.   TStrQueue = RECORD
  9.                  Data : string;
  10.                  Next : PStrRec;
  11.               END; (* of RECORD *)
  12.   StrQueue = OBJECT
  13.              Private
  14.                Start, Finish, Temp : PStrRec;
  15.              Public
  16.                CONSTRUCTOR Init;
  17.                PROCEDURE Reset;
  18.                FUNCTION Copy : String;
  19.                FUNCTION AtEnd : boolean;
  20.                PROCEDURE Enqueue (S : string);
  21.                PROCEDURE Dequeue (VAR S : string);
  22.                FUNCTION Empty : boolean;
  23.                DESTRUCTOR Done;
  24.              END; (* of Object StrQueue *)
  25.   pStrQueue = ^StrQueue;
  26.  
  27. IMPLEMENTATION
  28.  
  29. CONSTRUCTOR StrQueue.Init;
  30. BEGIN
  31.   Start := nil;
  32.   Finish := nil;
  33.   Temp := nil;
  34. END; (* of CONSTRUCTOR StrQueue.Init *)
  35.  
  36.  
  37.  
  38. PROCEDURE StrQueue.Reset;
  39. BEGIN
  40.   Temp := Start;
  41. END;  (* of StrQueue.Reset *)
  42.  
  43.  
  44.  
  45. FUNCTION StrQueue.Copy : String;
  46. BEGIN
  47.   if Temp <> nil then Copy := Temp^.Data
  48.   else Copy := '';
  49.  
  50.   if Temp <> Finish then Temp := Temp^.Next
  51.   else Temp := nil;
  52. END; (* of StrQueue.Copy *)
  53.  
  54.  
  55. FUNCTION StrQueue.AtEnd : boolean;
  56. BEGIN
  57.   AtEnd := Temp = nil;
  58. END; (* of StrQueue.AtEnd *)
  59.  
  60.  
  61.  
  62. PROCEDURE StrQueue.Enqueue (S : string);
  63. VAR
  64.   T : PStrRec;
  65.  
  66. BEGIN
  67.   new (T);
  68.   T^.Data := S;
  69.   T^.Next := nil;
  70.  
  71.   IF Start = nil THEN
  72.     Start := T
  73.   ELSE
  74.     Finish^.Next := T;
  75.   Finish := T;
  76. END; (* of StrQueue.Enqueue *)
  77.  
  78.  
  79.  
  80. PROCEDURE StrQueue.Dequeue (VAR S : string);
  81. VAR
  82.   T : PStrRec;
  83.  
  84. BEGIN
  85.  
  86.   IF Start = nil THEN BEGIN
  87.     S := '';
  88.     exit;
  89.   END; (* of IF *)
  90.  
  91.   S := Start^.Data;
  92.   T := Start^.Next;
  93.   dispose (Start);
  94.   Start := T;
  95. END; (* of StrQueue.Dequeue *)
  96.  
  97.  
  98.  
  99. FUNCTION StrQueue.Empty : boolean;
  100. BEGIN
  101.   Empty := Start = nil;
  102. END; (* of StrQueue.Empty *)
  103.  
  104.  
  105.  
  106. DESTRUCTOR StrQueue.Done;
  107. VAR
  108.   Belch : string;
  109. BEGIN
  110.   REPEAT
  111.     Dequeue (Belch);
  112.   UNTIL Empty;
  113. END; (* of Destructor StrQueue.Done *)
  114.  
  115.  
  116. END. (* of UNIT Queues *)
  117.  
  118. ---------------
  119.  
  120. PROGRAM TestStr;
  121.  
  122. USES Queues,strings;
  123.  
  124. CONST
  125.   MaxStrLen = $FFF8;
  126.  
  127. VAR
  128.   ThisString : StrQueue;
  129.   Temp : string;
  130.   blah : pchar;
  131.   theend : pointer;
  132.   T2 : array[0..80] of char;
  133.  
  134. BEGIN
  135.  
  136.   ThisString.Init;
  137.  
  138.   readln (temp);
  139.   WHILE Temp <> '' DO BEGIN
  140.     ThisString.enqueue (Temp);
  141.     readln (temp);
  142.   END; (* of WHILE *)
  143.  
  144.   getmem (blah, MaxStrLen);
  145.   fillchar (blah^, MaxStrLen, #0);
  146.  
  147.  
  148.   WHILE (NOT ThisString.Empty) and (strlen (blah) < (MaxStrLen - 81)) DO BEGIN
  149.     ThisString.dequeue (Temp);
  150.     StrPCopy (T2, Temp);
  151.     StrLCat (blah, T2, MaxStrLen);
  152.     StrLCat (blah, #13#10, MaxStrLen);
  153.   END; (* of WHILE *)
  154.  
  155.   write (blah);
  156.  
  157.   freemem (blah, MaxStrLen);
  158.  
  159.   readln;
  160. END.
  161.